<?php

namespace StarCloud\Library\Sdk;

use Framework\DiServices\HttpClient;
use Phalcon\Di;
use Ramsey\Uuid\Uuid;
use StarCloud\Library\Exception;
use StarCloud\Library\Tool;

class ByteDanceVoice
{
    /* @var $httpClient HttpClient */
    private $httpClient;
    private $cacheClass;
    private $client_key = "awg1hfaffbac94e3";
    private $client_secret = "16bb95421d67fdbd4ffef97bcbbbde41";
    private $client_token = "";
    private $appId = "8297648701";
    private $access_token = "Ewk-Rs1DmLZ-w1hM4YdQ8MFAoFbFjgwx";
    private $secret_key = "RxT4DrLh3Bi66Ss-CD2RQUNEo3IhoRv6";


    public function __construct($config = [])
    {
        $this->httpClient = Di::getDefault()->get('httpClient');
        $this->cacheClass = Di::getDefault()->get('redis');
        $this->client_key = $config['client_key'] ?? "awg1hfaffbac94e3";
        $this->client_secret = $config['client_secret'] ?? "16bb95421d67fdbd4ffef97bcbbbde41";
    }


    public function getHeader($rescourseId = "")
    {
        return [
            'Authorization' => "Bearer;{$this->access_token}",
            'Resource-Id' => empty($rescourseId) ? 'volc.megatts.voiceclone' : $rescourseId,
            "Content-Type" => "application/json",
        ];
    }
    public function cloneVoice($speaker_id = "S_rtFCHYaO", $sourceUrl)
    {
        $url = "https://openspeech.bytedance.com/api/v1/mega_tts/audio/upload?";

        $filePath = Tool::downloadUrlFile($sourceUrl);

        $body = [

                "speaker_id" => $speaker_id,
                "appid" => $this->appId,
                "audios" => [[
                    "audio_bytes" => base64_encode(file_get_contents($filePath)),
                    "audio_format"=> "mp3",
                    ]
                ],
                "source" => 2
        ];
        $response = $this->httpClient->sendPostRequest($url, $body, $this->getHeader());

        var_dump($response->getBody()->getContents());
    }

    public function getCloneStatus($speaker_id = "S_rtFCHYaO")
    {
        $url = "https://openspeech.bytedance.com/api/v1/mega_tts/status";

        $body = [
            "speaker_id" => $speaker_id,
            "appid" => $this->appId,
        ];

        $response = $this->httpClient->sendPostRequest($url, $body, $this->getHeader());

        var_dump($response->getBody()->getContents());
    }

    /**
     * @param $speakId  // 影视
     * @param $text // 文本
     * @param $stepId // 步骤ID
     * @return false|string
     * @throws \Exception
     */
    public function textToVoice($speakId = "S_devDnZ4O", $text, $reqId)
    {
        $url = "https://openspeech.bytedance.com/api/v1/tts";
        $body = [
            "app" => [
                "appid" => $this->appId,
                "token" => $this->access_token,
                "cluster" => 'volcano_mega'
            ],
            "user" => [
                "uid" => "388808087185088"
            ],
            "audio" => [
                "voice_type" => $speakId,
                "encoding" => "mp3",
                "speed_ratio" => 1.0,
                "volume_ratio" => 1.0,
                "pitch_ratio" => 1.0,
            ],
            "request" => [
                "reqid" => $reqId,
                "text" => $text,
                "text_type" => "plain",
                "operation" => "query",
                "with_frontend" => 1,
                "frontend_type" => "unitTson",
                'split_sentence' => 1,
            ]
        ];

        $response = $this->httpClient->sendPostRequest($url, $body, $this->getHeader("volc.tts_async.default"));
        $json = $response->getBody()->getContents();
        $json = json_decode($json, true);
        if (isset($json['data'])) {
            $filePath = ROOT_PATH . '/data/'. $reqId. '.mp3';
            file_put_contents($filePath, base64_decode($json['data']));
            return $filePath;
        } else {
            return false;
        }
    }

    public function getTextToVoice($taskId)
    {
        $url = "https://openspeech.bytedance.com/api/v1/tts_async/query?";

        $body = [
            "appid" => $this->appId,
            "task_id" => $taskId
        ];

        $response = $this->httpClient->sendGetRequest($url .http_build_query($body), $body, $this->getHeader("volc.tts_async.default"));

        var_dump($response->getBody()->getContents());
    }


    public function textToVoice1()
    {
        $url = "https://openspeech.bytedance.com/api/v1/tts_async/submit";
        $string = '"透过漆黑的玻璃，我能看到对面阳台，有个健壮的男人正聚精会神盯着我看。他的目光，是我身体的钥匙。我叫姜怡，是一名舞蹈艺考生。在父母和老师面前，我是品学兼优的好女孩。在同学面前，我是拒绝过无数追求者的高冷女神。但所有人都没见过，藏在清纯面目后，那个离经叛道、心理阴暗、真实的我。我…曾不止一次幻想过完全被动的爱。而这一切，都源自那个暑假。那天，爸妈去临市办事，计划当晚就能到家，但我等到12点，却接到他们要滞留两天的消息。“小怡，爸妈要后天才能回去，你自己在家注意安全啊！”“噢，好的。”挂了电话后，我望着空荡荡的房子。难得家里只有自己一个人，长期被学习压抑着的灵魂，让我有股强烈想要外出的冲动。我挑了件吊带齐臀短裙，重新洗了把脸，素面朝天下楼。夜色已深，街边除了烧烤摊，已经几乎看不到行人了。每次经过那些摊位，我都能感觉到，街边男人的火热视线，牢牢粘在我身上，甩也甩不掉。这种异性才会有的惊艳目光，让我倍感愉悦与兴奋。尤其是听到一个沉重的脚步声，紧紧吊在我身后不远处时。即使背对着他，我依旧能感觉到他炙热的视线，始终锁定在我的身后，像是随时会倾覆而下的岩浆，把我彻底溶化。这不可言喻的刺激——我像是被催眠一般，做出了疯狂的举动。我沉浸在舞蹈中，轻轻撩起裙摆，扭动的幅度越来越大，也……越走越偏。直到，我走进一条陌生的小巷。那个始终不远不近跟着我的脚步声，突然飞快向我靠近。没等我反应过来，一只粗壮有力的大手就从身后伸来，像铁钳一样捂住我的嘴，“别动。”突如其来的意外，让我先是愣住片刻，接着拼命挣扎，想要挣脱对方的控制。可男人强大的力道，根本容不得我反抗。他轻而易举把我按在墙上，将手探进我的裙底胡乱摸着。“啊！”我颤抖着惊叫，双臂抵着墙面，用力扭动腰肢，想要摆脱身后男人的束缚。但当一个冰冷的尖锐物体，顶住我的后腰时，我不敢动了。是刀！男人似乎看出我放弃抵抗，直接收起刀子，双手握住我的腰一提一顿，直把我浑身的筋骨皮肉都震得酥麻无比。我那长期练舞保持的柔软形体，被他深深压下腰，摆出了羞人的姿势。男人用力抓住我的马尾辫。“不要…求求你…饶了我…”我仰着脸踮起脚尖，从嗓子眼里挤出一声哀吟，试图做最后的挣扎。男人似乎更加兴奋了，毫不客气地撕碎我的丁字裤。完了！感受到身后的炙热，我认命般闭上眼睛，只希望他能在满足后，别再对我进行二次伤害。就在这时，小巷外传来了一阵嬉笑声。是几个年轻的男人，他们一边吵闹着，一边向小巷走来。听到声响，我一口咬在男人胳膊上。他吃痛松手，见势不对，提起裤子转身跑了。那几个男人越来越近，我不敢向流氓离开的方向逃，只能迅速把裙子放下。蹲在墙边，不敢抬头。男人们似乎也没想到巷子里会蹲着一个女人，突然安静了下来。但他们没有对我做什么，只有不知道是谁对我吹了声口哨，而后嬉笑着追上同伴。看着脚脖上挂着的白色布料，我的心扑通扑通跳个不停，脸像火烧一样。他们一定认为，我在随地嘘嘘。但丢脸总比被非礼强，等他逐渐远去后，我急忙把已经撕坏的衣裤脱掉，一刻也不敢耽搁的跑回家，踉踉跄跄钻进了浴室。水流从蓬蓬头里冲击而下，喷洒在我纯白如雪的身上，却无法熄灭内心的火焰。如果…如果没有发生意外，我就被那个男人强了。想到那个画面，我的双腿不由一阵战栗，浑身都起了鸡皮疙瘩。这种禁忌、羞耻又刺激的颤栗，在我心里逐渐转变成了兴奋。而这种兴奋，在我光着身子走出浴室时彻底达到顶点。我把家里所有的灯全部打开，在挂满奖状、奖杯的墙下尽情舞蹈，跳着我偷偷在网上学会，却从未在任何一个人面前跳过的放浪舞姿，每一个动作，都仿佛就为勾引男人而创造。直到，第六感让我望向了窗外。对面楼层全都暗了，只有顶层还只有一盏灯亮着。但透过玻璃，我发现似乎有个男人正趴在阳台，聚精会神地盯着我。刚才…我做的那些动作，被他…全看见了？这种隐私暴露在外人眼前的事，又让我想起了小巷里那个。他就像一枚钥匙，打开我深藏在心底的阴暗，放出一头叫做欲望的野兽。我回到卧室躺在床上，静静感受着那种情绪的微妙转变，变成渴望，渴望暴露在更锐利的目光下。我遵循着身体的本能，在落地窗前蹲下。透过穿衣镜的反射，我能偷偷瞥到那个男人。他也在！这种强烈的羞耻，让我内心的波涛一浪接一浪，每一处神经都紧绷到极限！我们心照不宣的注视着对方。第二夜，我再次套上昨晚的吊带短裙出门，不同的是这次我身下更为清凉。刚刚走出楼梯口，我的余光就看到不远处，似乎有个男人正盯着我。我装作没发现他，带着小鹿乱撞的心情往前走了几步，然后停下脚步，开始弯腰整理凉鞋。我偷偷向后瞥着，看到男人逐渐向我靠近，然后在两米远的距离蹲了下来，也假装在系鞋带。这个距离，刚好能看清我的全部。不管如何，鞋子总有整理好的时候，半分钟后，我站起身子，继续向前走去。走出小区后，我开始逐渐兴奋。尤其是裙底的清凉，让我有种偷偷干坏事的刺激感。今天和昨晚的经历，是完全不一样的快慰。我来到街角的一间店铺前，停下了脚步。这是我家的店面，最近正重新装修，还没开业，但临街落地窗已经贴好了反向膜，外面看是镜子，里面看是玻璃。我趴在窗前仔细检查了片刻，确定外面无法看到里面后，掏出钥匙，开门走了进去。我把空调打开，又把一个单人沙发推到落地窗前，拿掉防尘罩，脱下裙子舒舒服服地躺了上去。外面人来人往，他们看不到我，但我能看到他们。我把脚抵在玻璃上，感到一阵凉意。就在这时，一个健壮的男人来到落地镜前，足足有一米九之高，魁梧的身躯彻底挡住路灯的映射，把我罩进阴影里。是刚刚那个男人。虽然知道他肯定看不到我，可当我们隔着玻璃对视时，依然让我的心仿佛快要从嗓子眼里跳出来了！我仰起头，看着近在咫尺的男人，偷偷享受这隐秘的快乐。但不知为何，却突然觉得空虚。这远远不够，我还想要更多。我心底的小恶魔开始疯狂叫嚣起来，来吧，快来吧，这里有个女人正等着你…但我做梦都没想到，好像真听到我的心声，竟直接推开了门。直到这时，我才意识到自己忘记锁门了！我大脑一片空白，眼睁睁看着他把门栓扣上，一步步向我走来。“你…你想做什么？”这个男人的体型太过于巨大，给我带来极强的压力。但他不仅不回话，反而像昨晚那个男人一样，轻而易举把我拎了起来，按在墙上。那种被男人支配的强迫感，再次从我的头顶往下浇灌，沿着脊椎一路到脚底，又从脚底窜上心口，令我彻底放弃反抗。我双手撑着落地窗，踮着脚尖，乖乖的翘了起来';
        $utf8String = mb_convert_encoding($string, 'UTF-8', mb_detect_encoding($string));
        $body = [
            "reqid" => Uuid::uuid4()->toString(),
            "appid" => $this->appId,
            "text" => $utf8String,
            "format" => "mp3",
            "voice_type" => "S_devDnZ4O",
            "sample_rate" => 24000,
            "volume" => 1.2,
            "callback_url" => "https://api.doumvip.com/api/api/version"
        ];

        $response = $this->httpClient->sendPostRequest($url, $body, $this->getHeader("volc.tts_async.default"));

        var_dump($response->getBody()->getContents());
    }

}